/*******************************************************************************
* Copyright (c) 2014-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.editor.codemirror.highlighter.client;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.FunctionException;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.api.promises.client.callback.CallbackPromiseHelper;
import org.eclipse.che.api.promises.client.callback.CallbackPromiseHelper.Call;
import org.eclipse.che.ide.editor.codemirror.resources.client.BasePathConstant;
import org.eclipse.che.ide.editor.codemirrorjso.client.CodeMirrorOverlay;
import org.eclipse.che.ide.jseditor.client.requirejs.RequireJsLoader;
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.inject.Inject;
public class HighlighterInitializer {
/** The logger. */
private static final Logger LOG = Logger.getLogger(HighlighterInitializer.class.getSimpleName());
/** The base path for codemirror resources. */
private final String codemirrorBase;
private final RequireJsLoader requireJsLoader;
private final HighlighterInstance highlighterInstance;
@Inject
public HighlighterInitializer(final RequireJsLoader requireJsLoader,
final BasePathConstant basePathConstant,
final HighlighterInstance runmodeInstance) {
this.codemirrorBase = basePathConstant.basePath();
this.requireJsLoader = requireJsLoader;
this.highlighterInstance = runmodeInstance;
}
public void init() {
this.highlighterInstance.setPromise(initModes(Collections.<String> emptyList()));
}
public Promise<CodeMirrorOverlay> initModes(final List<String> modes) {
final String[] baseScripts = new String[]{codemirrorBase + "lib/codemirror",
codemirrorBase + "mode/meta",
codemirrorBase + "addon/mode/loadmode",
codemirrorBase + "addon/scroll/simplescrollbars",
codemirrorBase + "addon/scroll/scrollpastend",
};
final List<String> scriptList = new ArrayList<>();
for (final String script : baseScripts) {
scriptList.add(script);
}
for (final String mode : modes) {
scriptList.add(codemirrorBase + "mode/" + mode + "/" + mode);
}
final Call<JavaScriptObject[], Throwable> requireCall = new Call<JavaScriptObject[], Throwable>() {
@Override
public void makeCall(final Callback<JavaScriptObject[], Throwable> callback) {
requireJsLoader.require(callback, scriptList.toArray(new String[scriptList.size()]));
}
};
final Promise<JavaScriptObject[]> requirePromise = CallbackPromiseHelper.createFromCallback(requireCall);
requirePromise.then(new Operation<JavaScriptObject[]>() {
@Override
public void apply(final JavaScriptObject[] result) throws OperationException {
LOG.log(Level.INFO, "Obtained codemirror instance with runmode: " + result[0]);
}
});
requirePromise.catchError(new Operation<PromiseError>() {
@Override
public void apply(final PromiseError result) throws OperationException {
LOG.log(Level.SEVERE, "Failed to obtain codemirror instance");
LOG.fine(result.toString());
}
});
final Promise<CodeMirrorOverlay> highlightPromise = requirePromise.then(new Function<JavaScriptObject[], CodeMirrorOverlay>() {
@Override
public CodeMirrorOverlay apply(final JavaScriptObject[] args) throws FunctionException {
return args[0].cast();
}
});
return highlightPromise;
}
}